home *** CD-ROM | disk | FTP | other *** search
/ Hardcore Visual Basic 5.0 (2nd Edition) / Hardcore Visual Basic 5.0 - Second Edition (1997)(Microsoft Press).iso / Code / shortcut.cls < prev    next >
Text File  |  1997-06-14  |  8KB  |  257 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4. END
  5. Attribute VB_Name = "CShortcut"
  6. Attribute VB_GlobalNameSpace = False
  7. Attribute VB_Creatable = True
  8. Attribute VB_PredeclaredId = False
  9. Attribute VB_Exposed = True
  10. Option Explicit
  11.  
  12. Public Enum EErrorShortcut
  13.     eeBaseShortcut = 13210  ' CShortcut
  14. End Enum
  15.  
  16. Private link As New CShellLink
  17.  
  18.  ' Destination constants
  19. Enum EDestination
  20.     edstDesktop
  21.     edstCommonDesktop
  22.     edstPrograms
  23.     edstCommonPrograms
  24.     edstStartMenu
  25.     edstPath
  26.     edstCurrent
  27. End Enum
  28.  
  29. ' Show command constants (a subset of constants for SetWindowPos API)
  30. Enum EDisplayMode
  31.     edmNormal = SW_NORMAL
  32.     edmMinimized = SW_SHOWMINNOACTIVE
  33.     edmMaximized = SW_MAXIMIZE
  34. End Enum
  35.  
  36. '' Properties
  37.  
  38. '' Path of file represented by shortcut
  39. Property Get Path() As String
  40.     Dim fd As WIN32_FIND_DATA, s As String
  41.     s = String$(cMaxPath, 0)
  42.     link.GetPath s, cMaxPath, fd, SLGP_UNCPRIORITY
  43.     Path = MUtility.StrZToStr(s)
  44. End Property
  45.  
  46. Property Let Path(sPathA As String)
  47.     ' Make sure file exists
  48.     If Not MUtility.ExistFile(sPathA) Then ErrRaise eeFileNotFound
  49.     link.SetPath sPathA
  50. End Property
  51.  
  52. '' Startup directory for shortcut target
  53. Property Get WorkingDirectory() As String
  54.     Dim s As String
  55.     s = String$(cMaxPath, 0)
  56.     link.GetWorkingDirectory s, cMaxPath
  57.     WorkingDirectory = MUtility.StrZToStr(s)
  58. End Property
  59.  
  60. Property Let WorkingDirectory(sWorkingA As String)
  61.     link.SetWorkingDirectory sWorkingA
  62. End Property
  63.  
  64. ' Shortcut dialog ignores description, but we can save and restore it
  65. Property Get Description() As String
  66.     Dim s As String
  67.     s = String$(cMaxPath, 0)
  68.     link.GetDescription s, cMaxPath
  69.     Description = MUtility.StrZToStr(s)
  70. End Property
  71.  
  72. Property Let Description(sDescription As String)
  73.     link.SetDescription sDescription
  74. End Property
  75.  
  76. '' Arguments for shortcut target
  77. Property Get Arguments() As String
  78.     Dim s As String
  79.     s = String$(cMaxPath, 0)
  80.     link.GetArguments s, cMaxPath
  81.     Arguments = MUtility.StrZToStr(s)
  82. End Property
  83.  
  84. Property Let Arguments(sArgumentsA As String)
  85.     link.SetArguments sArgumentsA
  86. End Property
  87.  
  88. '' Display command can be Normal, Minimized, or Maximized
  89. Property Get DisplayMode() As EDisplayMode
  90.     DisplayMode = link.showCmd
  91. End Property
  92.  
  93. Property Let DisplayMode(edm As EDisplayMode)
  94.     ' IShellLink doesn't handle all SW_ constants, but we do
  95.     Select Case edm
  96.     Case SW_HIDE, SW_NORMAL, SW_SHOWNOACTIVATE, SW_SHOW, _
  97.          SW_SHOWNA, SW_RESTORE, SW_SHOWDEFAULT
  98.         ' Convert all these to normal: 0, 1, 4, 5, 8, 9, 10
  99.         edm = edmNormal
  100.     Case SW_SHOWMINIMIZED, SW_MINIMIZE, SW_SHOWMINNOACTIVE
  101.         ' Convert all these to minimized: 2, 6, 7
  102.         edm = edmMinimized
  103.     Case SW_MAXIMIZE
  104.         ' Pass maximize through: 3
  105.         edm = edmMaximized
  106.     Case Else
  107.         ' Convert anything else to normal
  108.         edm = edmNormal
  109.     End Select
  110.     link.showCmd = edm
  111. End Property
  112.  
  113. Property Get HotKey() As KeyCodeConstants
  114.     HotKey = link.HotKey
  115. End Property
  116.  
  117. Property Let HotKey(kcc As KeyCodeConstants)
  118.     link.HotKey = kcc
  119. End Property
  120.  
  121. Property Get Icon() As Variant
  122.     Dim s As String, i As Long, hIcon As Long
  123.     s = String$(cMaxPath, 0)
  124.     link.GetIconLocation s, cMaxPath, i
  125.     hIcon = ExtractIcon(App.hInstance, s, i)
  126.     Set Icon = MPicTool.IconToPicture(hIcon)
  127. End Property
  128.  
  129. Property Let Icon(vIcon As Variant)
  130.     If VarType(vIcon) = vbString Then
  131.         ' Assume icon file (index 0)
  132.         link.SetIconLocation CStr(vIcon), 0
  133.     Else
  134.         ' Assume index into embedded EXE
  135.         link.SetIconLocation Path, CLng(vIcon)
  136.     End If
  137. End Property
  138.  
  139. ' Link file parameter is Variant to accept any of these:
  140. '      edstDesktop          - Put on desktop
  141. '      edstCommonDesktop    - Put on shared desktop
  142. '      edstPrograms         - Put on programs menu
  143. '      edstCommonPrograms   - Put on shared programs menu
  144. '      edstStartMenu        - Put on start menu
  145. '      edstCurrent          - Put in current directory
  146. '      edstPath             - Put in same directory as target file
  147. '      [directory]          - Put in hardcoded path
  148. '      [file.LNK]           - Put in hardcoded file
  149. Function Save(vLinkFile As Variant) As String
  150.     Dim sLink As String
  151.     ' Convert constant or directory to full path
  152.     sLink = FixLocation(vLinkFile)
  153.     If sLink = sEmpty Then ErrRaise eeFileNotFound
  154.  
  155.     ' Save the object to disk
  156.     MCasts.IVBPersistFile(link).Save sLink, APITRUE
  157.     Save = sLink
  158. End Function
  159.  
  160. ' Flags control behavior if LNK file reference can't be resolved:
  161. '    SLR_ANY_MATCH - Display a dialog (with hWnd parameter as parent
  162. '                    window) asking user whether to search for reference
  163. '    SLR_NO_UI     - Search the disk for the time period specified by
  164. '                    TimeOut parameter
  165. Sub Resolve(sFileA As String, _
  166.             Optional Flags As ESLR = SLR_ANY_MATCH, _
  167.             Optional hWnd As Long = hNull, _
  168.             Optional TimeOut As Integer = 0)
  169.     ' Load from LNK file and resolve
  170.     MCasts.IVBPersistFile(link).Load sFileA, STGM_DIRECT
  171.     If Flags = SLR_NO_UI And TimeOut > 0 Then
  172.         Flags = Flags Or MBytes.LShiftDWord(TimeOut, 16)
  173.     End If
  174.     link.Resolve hWnd, Flags
  175. End Sub
  176.  
  177.  
  178. ' Location of .LNK file. Output is always full path of .LNK file
  179. Private Function FixLocation(vLocationA As Variant) As String
  180.     Dim s As String, sPath As String
  181.  
  182.     ' If user passes in string, save it internally
  183.     If VarType(vLocationA) = vbString Then
  184.         ' Convert to a full path
  185.         s = MUtility.GetFullPath(CStr(vLocationA))
  186.         ' If this is already a link file, return it
  187.         If UCase$(MUtility.GetFileExt(s)) = ".LNK" Then
  188.             FixLocation = s
  189.             Exit Function
  190.         Else
  191.             ' Can't use a location that doesn't exist
  192.             If Not MUtility.ExistFile(s) Then Exit Function
  193.  
  194.             ' Make sure directory ends with backslash
  195.             s = MUtility.NormalizePath(s)
  196.         End If
  197.     Else
  198.  
  199.         ' If location hasn't been set, we can't do anything
  200.         sPath = Path
  201.         If sPath = sEmpty Then Exit Function
  202.     
  203.         ' Create a directory from setting
  204.         Select Case vLocationA
  205.         Case edstCurrent:
  206.             ' Current directory
  207.             s = CurDir$
  208.         Case edstPath:
  209.             ' Directory of shortcut target
  210.             s = MUtility.GetFileDir(Path)
  211.         Case edstPath:
  212.         
  213.         Case edstCommonDesktop:
  214.             s = MRegTool.GetCommonDesktop
  215.         
  216.         Case edstPrograms:
  217.             s = MRegTool.GetPrograms
  218.         
  219.         Case edstCommonPrograms:
  220.             s = MRegTool.GetCommonPrograms
  221.         
  222.         Case edstStartMenu:
  223.             s = MRegTool.GetStartMenu
  224.         
  225.         Case Else ' Includes edstDesktop and any invalid arguments
  226.             ' Desktop directory
  227.             s = MRegTool.GetDesktop
  228.         End Select
  229.     End If
  230.     
  231.     ' Combine directory, path name, and LNK extension
  232.     FixLocation = s & MUtility.GetFileBase(sPath) & ".LNK"
  233.     
  234. End Function
  235. '
  236.  
  237. #If fComponent = 0 Then
  238. Private Sub ErrRaise(e As Long)
  239.     Dim sText As String, sSource As String
  240.     If e > 1000 Then
  241.         sSource = App.ExeName & ".Shortcut"
  242.         Select Case e
  243.         Case eeBaseShortcut
  244.             BugAssert True
  245.        ' Case ee...
  246.        '     Add additional errors
  247.         End Select
  248.         Err.Raise COMError(e), sSource, sText
  249.     Else
  250.         ' Raise standard Visual Basic error
  251.         sSource = App.ExeName & ".VBError"
  252.         Err.Raise e, sSource
  253.     End If
  254. End Sub
  255. #End If
  256.  
  257.